//package com.biShe.controller;
//
//import com.biShe.entity.WechatUser;
//import com.biShe.mapper.WechatUserMapper;
//import com.biShe.vo.KMeansResult;
//import com.biShe.vo.WechatUserCluster;
//import com.biShe.vo.WechatUserClusterFactory;
//import com.biShe.vo.WechatUserClusterResult;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.format.annotation.DateTimeFormat;
//import org.springframework.web.bind.annotation.*;
//
//import java.time.LocalDate;
//import java.time.Period;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//
//
//@RestController
//@RequestMapping("/kmeans")
//public class KMeansController {
//
//    @Autowired
//    private WechatUserMapper wechatUserMapper;
//
//    @GetMapping("/cluster")
//    public List<KMeansResult> cluster(@RequestParam int k) {
//        List<WechatUser> userList = wechatUserMapper.selectList(null);
//        preprocessData(userList);
//
//        double[][] attributeArray = new double[userList.size()][6];
//        for (int i = 0; i < userList.size(); i++) {
//            attributeArray[i][0] = userList.get(i).getMonetary();
//            attributeArray[i][1] = Double.parseDouble(userList.get(i).getRecency());
//            attributeArray[i][2] = userList.get(i).getFrequency();
//            attributeArray[i][3] = userList.get(i).getGender();
//            attributeArray[i][4] = Double.parseDouble(userList.get(i).getBirthday());
//            attributeArray[i][5] = getRegistrationTime(userList.get(i).getRegistertime());
//        }
//
//        // 进行 K-Means 聚类算法
//        KMeans kMeans = new KMeans(k, attributeArray);
//        kMeans.cluster();
//
//        // 获取分类结果
//        List<KMeansResult> resultList = new ArrayList<>();
//        for (int i = 0; i < k; i++) {
//            double[] center = kMeans.getClusterCenter(i);
//            int count = kMeans.getClusterCount(i);
//            KMeansResult result = new KMeansResult(i + 1, count, center[0], center[1], (int) center[2], center[3], (int) center[4], (int) center[5]);
//            resultList.add(result);
//        }
//
//        return resultList;
//    }
//
//
//    private void preprocessData(List<WechatUser> userList) {
//        for (int i = 0; i < userList.size(); i++) {
//            if (userList.get(i).getMonetary() == null) {
//                userList.get(i).setMonetary(0f);
//            }
//            if (userList.get(i).getRecency() == null) {
//                userList.get(i).setRecency("0");
//                String registrationTime = userList.get(i).getRegistertime();
//                if (registrationTime != null) {
//                    userList.get(i).setRecency(String.valueOf(registrationTime));
//                }
//            }
//            if (userList.get(i).getFrequency() == null) {
//                userList.get(i).setFrequency(0);
//            }
//            if (userList.get(i).getGender() == null) {
//                userList.get(i).setGender(getGenderMode(userList));
//            }
//            if (userList.get(i).getBirthday() == null) {
//                userList.get(i).setBirthday(getBirthdayMedian(userList));
//            }
//        }
//    }
//
//    private int getGenderMode(List<WechatUser> userList) {
//        Map<Integer, Integer> genderMap = new HashMap<>();
//        for (WechatUser user : userList) {
//            if (user.getGender() != null) {
//                Integer count = genderMap.getOrDefault(user.getGender(), 0);
//                genderMap.put(user.getGender(), count + 1);
//            }
//        }
//        int mode = -1;
//        int maxCount = 0;
//        for (Map.Entry<Integer, Integer> entry : genderMap.entrySet()) {
//            if (entry.getValue() > maxCount) {
//                mode = entry.getKey();
//                maxCount = entry.getValue();
//            }
//        }
//        return mode;
//    }
//
//    private String getBirthdayMedian(List<WechatUser> userList) {
//        List<String> ageList = new ArrayList<>();
//        for (WechatUser user : userList) {
//            if (user.getBirthday() != null) {
//                ageList.add(user.getBirthday());
//            }
//        }
//        Collections.sort(ageList);
//        int size = ageList.size();
//        if (size == 0) {
//            return null;
//        } else if (size % 2 == 0) {
//            int medianIndex = size / 2;
//            return ageList.get(medianIndex);
//        } else {
//            int medianIndex = (size - 1) / 2;
//            return ageList.get(medianIndex);
//        }
//    }
//
//    // 计算注册时间距离现在的天数
//    private int getRegistrationTime(String registrationTime) {
//        LocalDate registrationDate = LocalDate.parse(registrationTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//        LocalDate now = LocalDate.now();
//        Period period = Period.between(registrationDate, now);
//        return period.getDays();
//    }
//}
